home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-06-22 | 2.7 KB | 104 lines | [TEXT/MMCC] |
- // File "patches.c" -
-
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
- /* Include Files */
-
- #include <A4Stuff.h>
- #include <Traps.h>
-
- #include "stdtypes.h"
- #include "stddebug.h"
-
- #include "patches.h"
-
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
- /* Global Declarations */
-
- static pascal void PatchE2S(void);
-
- #if GENERATINGCFM
- static RoutineDescriptor gPatchE2SRD =
- BUILD_ROUTINE_DESCRIPTOR(uppExitToShellProcInfo, PatchE2S);
- static ExitToShellUPP gPatchE2SUPP = &gPatchE2SRD;
- #else
- static ExitToShellUPP gPatchE2SUPP = PatchE2S;
- #endif
- static ExitToShellUPP gSaveE2SUPP = 0;
- static QHdr gE2STaskQ;
-
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
-
- SInt32 InstallE2STask(E2STaskProc taskProc, void *taskData) {
- SInt32 error = 0;
- E2STaskPtr taskElem;
-
- if (!gSaveE2SUPP) {
- UInt16 trap = _ExitToShell;
-
- #if GENERATINGPOWERPC
- MakeDataExecutable(&gPatchE2SRD, sizeof(gPatchE2SRD));
- #endif
-
- gSaveE2SUPP = (ExitToShellUPP)
- NGetTrapAddress(trap, (trap & 0x0800) ? ToolTrap : OSTrap);
- NSetTrapAddress((UniversalProcPtr) gPatchE2SUPP,
- trap, (trap & 0x0800) ? ToolTrap : OSTrap);
-
- gE2STaskQ.qHead = 0;
- }
-
- qThrowIfNull(taskElem = (E2STaskPtr) NewPtr(sizeof(E2STask)), MemError(), "");
- taskElem->proc = taskProc;
- taskElem->data = taskData;
- Enqueue((QElem *) taskElem, &gE2STaskQ);
-
- /* CATCH */
- qCatch();
- return(error);
- }
-
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
-
- void RemoveE2STask(E2STaskProc taskProc, void *taskData) {
- E2STaskPtr taskElem;
-
- while(taskElem = (E2STaskPtr) gE2STaskQ.qHead) {
- if ((taskElem->proc == taskProc) && (taskElem->proc == taskProc))
- Dequeue((QElem *) taskElem, &gE2STaskQ);
- }
- }
-
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
- /* **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** */
-
- pascal void PatchE2S() {
- #if GENERATINGCFM || __A5__
- UInt32 saveA5 = SetCurrentA5();
- #else
- UInt32 saveA4 = SetCurrentA4();
- #endif
- ExitToShellUPP tempE2SUPP;
- E2STaskPtr taskElem;
-
- while(taskElem = (E2STaskPtr) gE2STaskQ.qHead) {
- Dequeue((QElem *) taskElem, &gE2STaskQ);
- (*taskElem->proc)(taskElem->data);
- }
-
- // Stash off the global before resetting globals register
- tempE2SUPP = gSaveE2SUPP;
-
- #if GENERATINGCFM || __A5__
- SetA5(saveA5);
- #else
- SetA4(saveA4);
- #endif
-
- CallExitToShellProc(tempE2SUPP);
- }
-
-